home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_09_08 / 9n08017a < prev    next >
Text File  |  1991-07-08  |  1KB  |  38 lines

  1. /* _Dnorm function -- IEEE 754 version */
  2. #include "xmath.h"
  3.  
  4. short _Dnorm(unsigned short *ps)
  5.         {       /* normalize double fraction */
  6.         short xchar;
  7.         unsigned short sign = ps[_D0] & _DSIGN;
  8.  
  9.         xchar = 0;
  10.         if ((ps[_D0] &= _DFRAC) != 0 || ps[_D1]
  11.                 || ps[_D2] || ps[_D3])
  12.                 {       /* nonzero, scale */
  13.                 for (; ps[_D0] == 0; xchar -= 16)
  14.                         {       /* shift left by 16 */
  15.                         ps[_D0] = ps[_D1], ps[_D1] = ps[_D2];
  16.                         ps[_D2] = ps[_D3], ps[_D3] = 0;
  17.                         }
  18.                 for (; ps[_D0] < 1<<_DOFF; --xchar)
  19.                         {       /* shift left by 1 */
  20.                         ps[_D0] = ps[_D0] << 1 | ps[_D1] >> 15;
  21.                         ps[_D1] = ps[_D1] << 1 | ps[_D2] >> 15;
  22.                         ps[_D2] = ps[_D2] << 1 | ps[_D3] >> 15;
  23.                         ps[_D3] <<= 1;
  24.                         }
  25.                 for (; 1<<_DOFF+1 <= ps[_D0]; ++xchar)
  26.                         {       /* shift right by 1 */
  27.                         ps[_D3] = ps[_D3] >> 1 | ps[_D2] << 15;
  28.                         ps[_D2] = ps[_D2] >> 1 | ps[_D1] << 15;
  29.                         ps[_D1] = ps[_D1] >> 1 | ps[_D0] << 15;
  30.                         ps[_D0] >>= 1;
  31.                         }
  32.                 ps[_D0] &= _DFRAC;
  33.                 }
  34.         ps[_D0] |= sign;
  35.         return (xchar);
  36.         }
  37.  
  38.